#ifndef _TBVEC4_H_
#define _TBVEC4_H_

namespace tb
{

	class Vec3;

	class TB_DLL_FUNC Vec4
	{
	
	public:
	
		Vec4();
		Vec4(const Vec3& a_Vector, float a_W = 1.f);
		Vec4(float a_X, float a_Y, float a_Z, float a_W);
		Vec4(const Vec4& a_Copy);
		~Vec4();

		// ================================
		// Assignment & Access
		// ================================

		Vec4& operator = (const Vec4& a_Point);
		Vec4& operator = (const Vec3& a_Point);
		Vec4& operator = (float a_Value);
		float& operator [] (int a_Member);
		float operator [] (int a_Member) const;

		Vec4& operator += (const Vec4& a_Other);

		Vec4 operator * (float a_Scalar) const;

		// ================================
		// Functions
		// ================================

		Vec3 Project() const;
		Vec4& GetProjected(Vec3& a_Target);

		// ================================
		// Data
		// ================================
	
		float x, y, z, w;
	
	}; // class Vec4

}; // namespace tb

#include "TBVec4.inl"
	
#endif